package es.udc.acs.banco.server;

import java.sql.SQLException;

import es.udc.acs.banco.exceptions.CuentaDestinoException;
import es.udc.acs.banco.exceptions.CuentaNoValidaException;
import es.udc.acs.banco.exceptions.CuentaOrigenDestinoIgualesException;
import es.udc.acs.banco.exceptions.CuentaOrigenException;
import es.udc.acs.banco.exceptions.CuentaOrigenSaldoInsuficienteException;
import es.udc.acs.banco.exceptions.CuentaSaldoInsuficienteException;
import es.udc.acs.banco.exceptions.TarjetaNoValidaException;
import es.udc.acs.banco.operations.DBBancoOperations;
import es.udc.acs.database.exception.ConexionInvalidaException;
import es.udc.acs.parser.ParserMensaje;
import es.udc.acs.utils.CodigosFAP;

public class DatosServer{

	public String procesarPregunta(String mensaje, String tipo) {		
		
		String respuesta = "";
		
		//obtenemos el cuerpo
		String cuerpo  = ParserMensaje.obtenerCuerpoSub(mensaje);
		//obtenemos el primer campo del cuerpo (banco tarjeta)
		String tarjeta = ParserMensaje.obtenerNumTarjeta(cuerpo); 
		
		String online = ParserMensaje.
				obtenerCodOnline(ParserMensaje.obtenerSubcabecera(mensaje));

		boolean offline = online.equals("0");
		
		try {
			
			if (tipo.equals(CodigosFAP.CM_C_PD_CONSULTAR_SALDO)) { 			
				respuesta = respuestaConsultaSaldo(tarjeta,cuerpo);					
			} else if (tipo.equals(CodigosFAP.CM_C_PD_CONSULTAR_MOVIMIENTOS)) {			
				respuesta = respuestaConsultarMovimientos(tarjeta,cuerpo);
			} else if (tipo.equals(CodigosFAP.CM_C_PD_REINTEGRO)) {		
				respuesta = respuestaReintegro(tarjeta,cuerpo,offline);
			} else if (tipo.equals(CodigosFAP.CM_C_PD_ABONO)) { 
				respuesta = respuestaAbono(tarjeta,cuerpo);
			} else if (tipo.equals(CodigosFAP.CM_C_PD_TRASPASO)) {
				respuesta = respuestaTraspaso(tarjeta,cuerpo,offline);
			} else {
				return CodigosFAP.CR_CONSULTA_DENEGADA;
			}
			
		} catch (SQLException e) {
			return CodigosFAP.CR_CONSULTA_DENEGADA;
		} catch (CuentaNoValidaException e) {
			return CodigosFAP.CR_CONSULTA_DENEGADA_CENV;
		} catch (TarjetaNoValidaException e) {
			return CodigosFAP.CR_CONSULTA_DENEGADA_TNV;
		} catch (ConexionInvalidaException e) {
			return CodigosFAP.CR_CONSULTA_DENEGADA;
		} catch (CuentaSaldoInsuficienteException e) {
			return CodigosFAP.CR_CONSULTA_DENEGADA_IMLC;
		} catch (NumberFormatException e) {
			return CodigosFAP.CR_CONSULTA_DENEGADA;
		} catch (CuentaOrigenDestinoIgualesException e) {
			return CodigosFAP.CR_CONSULTA_DENEGADA_TOMTD;
		} catch (CuentaOrigenException e) {
			return CodigosFAP.CR_CONSULTA_DENEGADA_CONV;
		} catch (CuentaDestinoException e) {
			return CodigosFAP.CR_CONSULTA_DENEGADA_CDNV;
		} catch (CuentaOrigenSaldoInsuficienteException e) {
			return CodigosFAP.CR_CONSULTA_DENEGADA_TONF;
		}
		
		return CodigosFAP.CR_CONSULTA_ACEPTADA+respuesta;
	}
	
	
	private String respuestaConsultaSaldo(String tarjeta ,
			                              String cuerpo) 
										  throws SQLException, 
												 CuentaNoValidaException, 
												 TarjetaNoValidaException, 
											     ConexionInvalidaException {
		
		String respuesta = "";		
	
		respuesta =	DBBancoOperations.
				consultaSaldo(ParserMensaje.obtenerBanco(tarjeta), 
				              ParserMensaje.obtenerTarjeta(tarjeta),					
				              ParserMensaje.obtenerNumCuenta(cuerpo));
				
		return respuesta;
	}
	
	
	private String respuestaConsultarMovimientos(String tarjeta,
			                                     String cuerpo) 
											     throws SQLException, 
												 	    CuentaNoValidaException,
													    TarjetaNoValidaException, 
													    ConexionInvalidaException {
		
		String respuesta = "";

		respuesta =	DBBancoOperations.
				consultaMovimientos(ParserMensaje.obtenerBanco(tarjeta), 
				                    ParserMensaje.obtenerTarjeta(tarjeta),					
				                    ParserMensaje.obtenerNumCuenta(cuerpo));
					
		return respuesta;
	}
	
	
	private String respuestaReintegro(String tarjeta,
			                          String cuerpo,
			                          boolean offline) 
			                          throws SQLException, 
			                                 CuentaNoValidaException, 
			                                 TarjetaNoValidaException, 
			                                 ConexionInvalidaException, 
			                                 CuentaSaldoInsuficienteException {
		
		String respuesta = "";	

		respuesta = DBBancoOperations.
				reintegro(ParserMensaje.obtenerBanco(tarjeta), 
				          ParserMensaje.obtenerTarjeta(tarjeta),					
				          ParserMensaje.obtenerNumCuenta(cuerpo),
				          ParserMensaje.obtenerImporte(cuerpo),
				          offline,
				          true);
					
		return respuesta;
	}
	
	
	private String respuestaAbono(String tarjeta,
			                      String cuerpo) 
			                      throws SQLException, 
			                             CuentaNoValidaException, 
			                             TarjetaNoValidaException, 
			                             ConexionInvalidaException {
		
		String respuesta = "";		

		respuesta = DBBancoOperations.
				abono(ParserMensaje.obtenerBanco(tarjeta), 
				      ParserMensaje.obtenerTarjeta(tarjeta),					
				      ParserMensaje.obtenerNumCuenta(cuerpo),
				      ParserMensaje.obtenerImporte(cuerpo),
				      true);
					
		return respuesta;
	}
	
	
	private String respuestaTraspaso(String tarjeta,
			                         String cuerpo,
			                         boolean offline) 
			                         throws NumberFormatException, 
			                                SQLException, 
			                                CuentaOrigenDestinoIgualesException, 
			                                CuentaOrigenException, 
			                                CuentaDestinoException, 
			                                CuentaNoValidaException, 
			                                TarjetaNoValidaException, 
			                                CuentaOrigenSaldoInsuficienteException, 
			                                ConexionInvalidaException {
		
		String respuesta = "";		

		respuesta =	DBBancoOperations.
				traspaso(ParserMensaje.obtenerBanco(tarjeta), 
						 ParserMensaje.obtenerTarjeta(tarjeta),					
				         ParserMensaje.obtenerNumCuenta(cuerpo),
				         ParserMensaje.obtenerNumCuentaD(cuerpo),
				         ParserMensaje.obtenerImporteTraspaso(cuerpo),
				         offline);
					
		return respuesta;	
	}

}
